package com.itaming.lycheeframework.api.exception;

import com.itaming.lycheeframework.api.result.IErrorCode;
import lombok.Getter;

import java.io.Serial;

/**
 * 业务异常抽象类
 *
 * @author A.Ming
 */
@Getter
public abstract class AbstractApiException extends RuntimeException {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 错误码状态码
     */
    private final Integer code;

    /**
     * 构造函数
     *
     * @param errorCode 错误码对象
     */
    protected AbstractApiException(IErrorCode errorCode) {
        super(errorCode.getMessage());
        this.code = errorCode.getCode();
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码对象
     * @param message   错误信息
     */
    protected AbstractApiException(IErrorCode errorCode, String message) {
        super(message);
        this.code = errorCode.getCode();
    }

    /**
     * 填充堆栈跟踪
     * <p>
     * 业务异常是用于表示系统内预期的逻辑错误，
     * 其发生场景是可预知的，通常无需记录堆栈信息，以降低性能开销
     *
     * @return Throwable
     */
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }

    /**
     * 返回描述字符串
     *
     * @return 描述字符串
     */
    @Override
    public String toString() {
        String s = getClass().getName();
        String message = getLocalizedMessage();
        return "%s: (%s)%s".formatted(s, code, message);
    }

}
